home *** CD-ROM | disk | FTP | other *** search
/ Disc to the Future 2 / Disc to the Future Part II Programmer's Reference (Wayzata Technology)(6013)(1992).bin / MAC / THINKC / TCL1 / CEDITOR_ / CUNDOTAS.C < prev    next >
Text File  |  1992-01-12  |  4KB  |  136 lines

  1. /***************************************************************************************
  2.     CUndoTask.c                                                        SUPERCLASS = CTask
  3.  
  4.     Provides UNDO capability by a brute force method: a copy of a CEditor object is
  5.     made, including all of the text. When UNDO is selected, the copy is swapped with
  6.     the latest version, effectively UNDOing the last changes. REDO is handled the 
  7.     same way.
  8.  
  9.     Could easily be improved by reducing memory requirements by storing only the
  10.     information required to convert existing text to an earlier version.
  11.  
  12.     Copyright ⌐ BRH Toolsmith, 1992. All rights reserved.
  13.     Developed using THINK C 4.0.2 and Symantec's OOP libraries.
  14.     Portions of this code courtesy Symantec, Inc.
  15.     This code may be freely distributed as long as this notice remains. If you wish
  16.     to distribute modifications to these classes, please make a copy of the class
  17.     and implement your changes there. That's the beauty of OOP!
  18.  
  19.     NOTE: tabs in this file are set at 4 in THINK C.
  20.  
  21. ***************************************************************************************/
  22.  
  23. #include "CUndoTask.h"
  24.  
  25. #include <CApplication.h>
  26. #include <CError.h>
  27. #include <CScrollPane.h>
  28.  
  29. extern CApplication        *gApplication;
  30. extern CError            *gError;
  31.  
  32.  
  33. /***************************************************************************************
  34.     IUndoTask Method
  35.  
  36.     Store given values.
  37. ***************************************************************************************/
  38. void CUndoTask :: IUndoTask( CEditor *anEditor, CEditor *aCopy, short aTask )
  39. {
  40.     inherited::ITask( aTask );
  41.  
  42.     oldEditor = aCopy;
  43.     newEditor = anEditor;
  44. }
  45.  
  46.  
  47.  
  48. /***************************************************************************************
  49.     Dispose Method                                                        *** OVERRIDE ***
  50.  
  51.     Dispose of CEditor copy and then do ourselves in.
  52. ***************************************************************************************/
  53. void CUndoTask :: Dispose( void )
  54. {
  55.     oldEditor->Dispose();
  56.     inherited::Dispose();
  57. }
  58.  
  59.  
  60.  
  61. /***************************************************************************************
  62.     Undo Method                                                            *** OVERRIDE ***
  63.  
  64.     Make a copy of the current CEditor object. Replace the new one with the contents of
  65.     the old one, and make the old one point to the copy of the new one.
  66. ***************************************************************************************/
  67. void CUndoTask :: Undo( void )
  68. {
  69.     Handle        src, dst, copy;
  70.     long        size;
  71.     CScrollPane    *aScrollPane;
  72.  
  73.     /*
  74.      * Reset just in case
  75.      */
  76.     oldEditor->activeUndo = FALSE;
  77.  
  78.     /*
  79.      * Get references to both old and new editor versions.
  80.      * Make a copy of the new one for use later.
  81.      */
  82.     src = (Handle )oldEditor;
  83.     copy = dst = (Handle )newEditor;
  84.     size = GetHandleSize( src );
  85.  
  86.     gApplication->RequestMemory( FALSE, TRUE );
  87.     HandToHand( © );
  88.     gApplication->RequestMemory( FALSE, FALSE );
  89.  
  90.     /*
  91.      * Copy contents of old CEditor object into current CEditor object
  92.      */
  93.     HLock( src );
  94.     HLock( dst );
  95.     BlockMove( *src, *dst, size );
  96.     HUnlock( src );
  97.     HUnlock( dst );
  98.  
  99.     /*
  100.      * Free our old version and store the handle to the new copy.
  101.      */
  102.     if ( copy ) {
  103.         DisposHandle( src );
  104.         oldEditor = (CEditor *)copy;
  105.     }
  106.     else {
  107.         gError->PostAlert( 5000, 1 );
  108.     }
  109.  
  110.     /*
  111.      * If the CEditor has a controlling scroll pane, update it
  112.      */
  113.     aScrollPane = newEditor->itsScrollPane;
  114.     if ( aScrollPane ) {
  115.         aScrollPane->AdjustScrollMax();
  116.         aScrollPane->Calibrate();
  117.     }
  118.  
  119.     /*
  120.      * Redraw entire frame (what a waste...)
  121.      */
  122.     newEditor->Refresh();
  123. }
  124.  
  125.  
  126.  
  127. /***************************************************************************************
  128.     Redo Method                                                            *** OVERRIDE ***
  129.  
  130.     Just do the same thing as our Undo method.
  131. ***************************************************************************************/
  132. void CUndoTask :: Redo( void )
  133. {
  134.     Undo();
  135. }
  136.